package tools

import (
	"math"
)

//完成分页功能需求

/*

服务器要传递过来的数据有哪些
1.总页数
2.上一页页码
3.下一页页码
4.当前页数
5.总记录数


*/

type Page struct {
	TotalCount int
	TotalPages int
	Current    int
	Prev       int
	Next       int
	Pages      []int
}

// 定义一个变量(全局变量)用来记录每页显示的数量
var pageCount = 1

//增加一个包方法 允许修改每页显示的数量

func setPageCount(pc int) {
	//允许用户修改pageCount
	pageCount = pc
}

func GetPageCount() int {
	return pageCount
}

func GetPage(totalCount int, current int) Page {
	page := Page{
		TotalCount: totalCount,
		TotalPages: int(math.Ceil(float64(totalCount) / float64(pageCount))),
		Current:    current,
	}

	//动态生成所有的页码:go的模板技术中没有提供for循环 只有range遍历切片
	page = *getSinglePage(&page)
	var prev int
	var next int

	if current <= 1 {
		prev = 1
	} else {
		prev = current - 1
	}

	if next >= page.TotalPages {
		next = page.TotalPages
	} else {
		next = current + 1
	}

	page.Prev = prev
	page.Next = next
	return page

}

func getSinglePage(page *Page) *Page {

	//定义起始位置
	var start int = 1
	var end int = page.TotalPages

	//1.如果当前页面大于7 起始位置应该是当前页 - 5 结束页应该是当前页 + 4
	if page.Current >= 6 {
		start = page.Current - 5

		//前提是end的值不能超过总页数
		if page.Current+4 <= page.TotalPages {
			end = page.Current + 4
		}

	}

	//2.当前显示页码小于6页的时候 end保留10页逻辑
	if page.Current <= 6 {
		end = 10
	}

	//安全处理 : 如果总页数根本打不到10
	if page.TotalPages <= 10 {
		start = 1
		end = page.TotalPages
	}

	if page.Current > page.TotalPages {
		//用户输入的页数不存在(超范围) 让用户访问最后一页
		page.Current = page.TotalPages
	}

	for i := start; i <= end; i++ {
		page.Pages = append(page.Pages, i)
	}
	return page
}
